package fr.afcepf.atod21.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

import com.mysql.jdbc.Statement;

import fr.afcepf.atod21.data.Atod21DataSource;
import fr.afcepf.atod21.entity.Stagiaire;
import fr.afcepf.atod21.exception.Atod21Exeception;
/**
 * @see IDaoStagiaire
 * @author Stagiaire
 *
 */
public class DaoStagiaireImpl implements IDaoStagiaire{
    /**
     * DataSource pour l'acces a la BDD.
     */
    private Atod21DataSource ds = new Atod21DataSource();
    /**
     * requete pour ajouter dans la BDD.
     */
    private final String reqAjout = "INSERT INTO stagiaire (nom,prenom,adresse,date_naissance,id_organisme) values (?,?,?,?,?)";
    @Override
    public List<Stagiaire> rechercher(String paramNomTasVu) {
        return null;
    }

    @Override
    public List<Stagiaire> rechercher(int paramIdOrganismeTasVu) {
        // TODO Auto-generated method stub
        return null;
    }
    /**
     * Indice du parametre pour le nom du 
     * {@link Stagiaire} dans la requete 
     * {@link DaoStagiaireImpl#indiceNomReqAjout}
     */
    private final int indiceNomReqAjout = 1;
    /**
     * Indice du parametre pour le prenom du 
     * {@link Stagiaire} dans la requete 
     * {@link DaoStagiaireImpl#indicePrenomReqAjout}
     */
    private final int indicePrenomReqAjout = 2;
    /**
     * Indice du parametre pour l'adresse du 
     * {@link Stagiaire} dans la requete 
     * {@link DaoStagiaireImpl#indiceAdresseReqAjout}
     */
    private final int indiceAdresseReqAjout = 3;
    /**
     * Indice du parametre pour la date de naissance du 
     * {@link Stagiaire} dans la requete 
     * {@link DaoStagiaireImpl#indiceNaissanceReqAjout}
     */
    private final int indiceNaissanceReqAjout = 4;
    /**
     * Indice du parametre pour l'organisme du 
     * {@link Stagiaire} dans la requete 
     * {@link DaoStagiaireImpl#indiceOrganismeReqAjout}
     */
    private final int indiceOrganismeReqAjout = 5;
    @Override
    public Stagiaire ajouter(Stagiaire paramStagTasVu)  throws Atod21Exeception {
        try {
            Connection cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(indiceNomReqAjout, paramStagTasVu.getNom());
            pstmt.setString(indicePrenomReqAjout, paramStagTasVu.getPrenom());
            pstmt.setString(indiceAdresseReqAjout, paramStagTasVu.getAdresse());
            pstmt.setDate(indiceNaissanceReqAjout, new java.sql.Date(paramStagTasVu.getDateNaissance().getTime()));
 
            if(paramStagTasVu.getOrganisme()!=null && paramStagTasVu.getOrganisme().getId() != 0){
                pstmt.setInt(indiceOrganismeReqAjout, paramStagTasVu.getOrganisme().getId());
            } else {
                pstmt.setNull(indiceOrganismeReqAjout, Types.INTEGER);
            }
            int resultSql = pstmt.executeUpdate();
            if(resultSql==1) {
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next()){
                    paramStagTasVu.setId(rs.getInt(1));
                }
            }
        } catch (SQLException e) {
            throw new Atod21Exeception("Erreur 10001 - DaoStagiaire ->ajouter  t'as vu !"+e.getMessage());
        }
        
        return paramStagTasVu;
    }
    private final String reqRenvoi = "Update stagiaire set id_organisme = null where idstagiaire = ? and id_organisme = ?";
    private final int indiceIdStagRenvoi=1;
    private final int indiceIdOrgRenvoi=2;
    @Override
    public Stagiaire renvoi(Stagiaire paramStagTasVu) throws Atod21Exeception {

        Connection cnx;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqRenvoi);
            pstmt.setInt(indiceIdStagRenvoi, paramStagTasVu.getId());
            pstmt.setInt(indiceIdOrgRenvoi, paramStagTasVu.getOrganisme().getId());
            if(pstmt.executeUpdate()==1) {
                paramStagTasVu.setOrganisme(null);
            } else {
                throw new Atod21Exeception("Erreur 10002 - DaoStagiaire => renvoi le stagiaire n'est pas dans cet organisme");
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
            throw new Atod21Exeception("Erreur 10002 - DaoStagiaire=>Rnvoi");
        }
        return paramStagTasVu;
    }

}
